package com.diors.game.engine.arpg.fight;

import com.diors.game.engine.arpg.fight.attr.AttrEnum;
import com.diors.game.engine.arpg.fight.attr.object.AttrObject;

/**
 * 战斗公式
 * @author	darren.ouyang <ouyang.darren@gmail.com>
 * @date	2013年12月2日
 * @version 1.0
 * @copyright Copyright (c) 2013, darren.ouyang
 */
public class FightFormula 
{

	private final static FightFormula instance = new FightFormula();
	
	private FightFormula () {}
	
	public static FightFormula getInstance ()
	{
		return instance;
	}
	
	/**
	 * 计算暴击
	 * @return
	 * @author	darren.ouyang
	 * @create	2013年12月2日 下午6:10:19
	 */
	public float crit (AttrObject attackAt, AttrObject targetAt)
	{
		
		return 1f;
	}
	
	/**
	 * 计算挡格
	 * @return
	 * @author	darren.ouyang
	 * @create	2013年12月2日 下午6:09:57
	 */
	public float block (AttrObject attackAt, AttrObject targetAt)
	{
		return 0.2f;
	}
	
	/**
	 * 计算幸运值
	 * @param attackAt	攻击者战斗属性
	 * @return
	 * @author	darren.ouyang
	 * @create	2013年12月2日 下午6:08:30
	 */
	public float luck (AttrObject attackAt)
	{
		int luck = attackAt.getValue(AttrEnum.LUCK);
		return (luck / luck);
	}
	
	/**
	 * pvp战斗公式
	 * @param attackAt
	 * @param targetAt
	 * @param fight
	 * @return
	 * @author	darren.ouyang
	 * @create	2013年12月2日 下午6:02:48
	 */
	public int pvpHarm (AttrObject attackAt, AttrObject targetAt, FightObject fight)
	{
		float harm 	= 0;
		float _luck = fight.getLuck();
		float _atn 	= fight.getAtn();
		float _int 	= fight.getInt();
		
		harm += harm(_atn, _luck, attackAt.getValue(AttrEnum.ATNMAX), attackAt.getValue(AttrEnum.ATNMIN), targetAt.getValue(AttrEnum.DEF));
		harm += harm(_int, _luck, attackAt.getValue(AttrEnum.INTMAX), attackAt.getValue(AttrEnum.INTMIN), targetAt.getValue(AttrEnum.ADF));
		
		harm = harm *  fight.getCrit() * fight.getBlock();
		return (int)harm;
	}
	
	/**
	 * pve战斗公式
	 * @param attackAt
	 * @param targetAt
	 * @param fight
	 * @return
	 * @author	darren.ouyang
	 * @create	2013年12月2日 下午6:02:59
	 */
	public int pveHarm (AttrObject attackAt, AttrObject targetAt, FightObject fight)
	{
		return pvpHarm(attackAt, targetAt, fight);
	}
	
	/**
	 * 私有的战斗公式
	 * @param _type
	 * @param _luck
	 * @param attackMax
	 * @param attackMin
	 * @param defense
	 * @return
	 * @author	darren.ouyang
	 * @create	2013年12月2日 下午6:01:56
	 */
	private float harm (float _type, float _luck, float attackMax, float attackMin, float defense)
	{
		if (_type <= 0f)
			return 0f;
		
		float attrInt = (attackMax - attackMin) * _luck + attackMax;
		float harm = Math.max((attrInt - defense), attackMin) * _type; 
		return harm;
	}
}
